/**
 * 全站http配置
 *
 * axios参数说明
 *
 * meta:{
 *     text: Content-Type为"text/plain"
 *     serialize: 是否开启form表单提交
 *     original_response: 是否返回原始响应信息,默认不返回原始响应信息
 *     error_no_notice: 不进行错误通知,默认需要通知
 *     token_no_refresh: 请求操作不进行token刷新,默认需要刷新
 * }
 */
import axios from 'axios';
import store from '@/store/';
import {Message} from 'element-ui';
import NProgress from 'nprogress';
import 'nprogress/nprogress.css';

//默认超时时间
axios.defaults.timeout = 30000;

//返回其他状态码
axios.defaults.validateStatus = function (status) {
    return status >= 200 && status <= 500;
};

//跨域请求，允许保存cookie
axios.defaults.withCredentials = true;

// NProgress 配置
NProgress.configure({
    showSpinner: false
});

//http request拦截
axios.interceptors.request.use(config => {
    //开启 progress bar
    NProgress.start()

    const meta = (config._meta || {})

    // headers中配置text请求
    if (meta.text === true) {
        config.headers["Content-Type"] = "text/plain";
    }

    return config
}, error => {
    return Promise.reject(error)
});

//http response 拦截
axios.interceptors.response.use(result => {
    //关闭 progress bar
    NProgress.done();

    // 获取服务状态码
    const status = result.data.code || result.status

    // 默认获取接口返回消息，特殊情况重构消息
    let message = result.data.msg || result.statusText
    if (result.status === 404) {
        message = '访问资源不存在或网络异常'
    } else if (result.status === 500) {
        message = '服务器内部错误'
    }

    const meta = result.config._meta || {}

    // 如果是401则跳转到登录页面
    if (status === 401) {
        store.dispatch('logoutAction').then(() => router.push({path: '/login'}))
    }

    // 如果请求为非200时不处理错误通知
    if (status !== 200 && meta.error_no_notice) {
        return Promise.reject(message)
    }

    // 其余请求为非200则默认统一处理
    if (status !== 200) {
        Message.error(message)
        return Promise.reject(message)
    }

    // 如果需要原始响应信息
    if (meta.original_response === true) {
        return result
    }
    return result.data;
}, error => {
    NProgress.done();
    return Promise.reject(error);
})

export default axios;
